/** 
 * Speichert alle Standorte.
 * 
 * Datei: Standortverwalter.java       Autor: Simon Schindelmann 
 * Datum: 18.11.11                     Version: 0.1
 * 
 */

package medienverwaltung;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import medienverwaltung.simulation.Simulation;
import basis.ea.EA;
import kommunikation.Wohnsitzadresse;

public class Standortverwalter
{
  private static ArrayList<Standort> standortListe 
  	= new ArrayList<Standort> ();
  private static HashMap<Integer, Standort> zuordnungIS 
  	= new HashMap<Integer, Standort> ();
  private ArrayList<Standort> temp;
  private EA ea;
  
  /**
   * Wenn das Objekt erzeugt wird werden die Serialisierten Listen
   * geladen. (Nur bei der ersten Erzeugung des Objektes).  
   * @warning In der Methode sind Warnungen vorhanden, die nicht
   * entfernt werden koennen, da der Typ zur Laufzeit nicht
   * ueberprueft werden kann.
   */
  public Standortverwalter ()
  {
    temp = new ArrayList<Standort> ();
    if(Simulation.istStandort () == false)
    {
      Simulation.setzeStandort (true);
      ea = new EA ("medienverwaltung.standort");
      if (ea.istGespeichertesXMLObjektVorhanden ())
      {
        standortListe = (ArrayList<Standort>) ea.einlesenXML ();
      }
      ea = new EA ("medienverwaltung.zuordnungIS");
      if (ea.istGespeichertesXMLObjektVorhanden ())
      {
        zuordnungIS = (HashMap<Integer, Standort>) ea.einlesenXML ();
      }
    }
  }

  
  /**
   * Ein Standort wird der temporaeren Listen hinzugefuegt.
   * @param s Standort der Hinzugefuegt wird.
   */
  public void standortHinzufuegen (Standort s)
  {
    //standortListe.add (s);
    temp.add (s);
  }

  
  /**
   * Ein Standort wird der temporaeren Listen hinzugefuegt.
   * @param name Name des Standortes.
   * @param ort Ort des Standortes.
   * @param plz Postleitzahl des Standortes.
   * @param hausnummer Hausnummer des Standortes.
   * @param strasse Strasse des Standortes.
   * @param laenge Laenge des Standortes.
   * @param breite Breite des Standortes.
   */
  public void standortHinzufuegen (String name, String ort, String plz, 
      String hausnummer, String strasse, int laenge, int breite)
  {
    Wohnsitzadresse a = new Wohnsitzadresse (ort, plz, hausnummer,
        strasse);
    Standort s = new Standort (name, a, laenge, breite);
    temp.add (s);
  }
  
  
  /**
   * Loescht einen Standort
   * @param id Id des Standorts der geloescht werden soll.
   */
  public void standortLoeschen (int id)
  {  
    Standort st = null;
    for (Standort s : standortListe)
    {
      if (s.gibStandortId () == id)
      {
	st = s;
      }
    }
    if(st != null)
    {
      standortListe.remove (st);
    }
    zustandSpeichern();
  }

  
  /**
   * Gibt den Standort mit der entsprechenden ID zurueck.
   * @param id ID des Standortes der zurueck gegeben werden soll.
   * @return Standort mit der entsprechenden ID. Gibt es keine Standort
   * mit dieser ID wird null zurueck gegeben.
   */
  public Standort gibStandort (int id)
  {
    int sid = id;
    for (Standort s : standortListe)
    {
      if (s.gibStandortId () == sid)
      {
        return s;
      }
    }
    return null;
  }
  
  
  /**
   * Gibt den Standort mit der entsprechenden ID aus der temporaeren 
   * Liste zureuck.
   * @param id ID des Standortes der zurueck gegeben werden soll.
   * @return Standort mit der entsprechenden ID. Gibt es keine Standort
   * mit dieser ID wird null zurueck gegeben.
   */
  public Standort gibStandortTemp (int id)
  {
    int sid = id;
    for (Standort s : temp)
    {
      if (s.gibStandortId () == sid)
      {
        return s;
      }
    }
    return null;
  }
  
  /**
   * Prueft ob ein Standort mit der entsprechenden ID vorhanden ist.
   * @param id ID des Standortes der geprueft werden soll.
   * @return liefert true zueck wenn ein Stnandort mit der
   * entsprechenden ID vorhanden ist. Andernfalls false.
   */
  public boolean standortVorhanden (int id)
  {
    int sid = id;
    for (Standort s : standortListe)
    {
      if (s.gibStandortId () == sid)
      {
        return true;
      }
    }
    return false;
  }
  
  
  /**
   * Prueft ob ein Standort in der temporaeren Liste mit der 
   * entsprechenden ID vorhanden ist.
   * @param id ID des Standortes der geprueft werden soll.
   * @return liefert true zueck wenn ein Stnandort mit der
   * entsprechenden ID vorhanden ist. Andernfalls false.
   */
  public boolean standortVorhandenTemp (int id)
  {
    int sid = id;
    for (Standort s : temp)
    {
      if (s.gibStandortId () == sid)
      {
        return true;
      }
    }
    return false;
  }
  
  
  /**
   * Gibt eine Liste mit den Standorten zurueck.
   * @return ArrayListe mit allen Standorten.
   */
  public ArrayList<Standort> gibStandortListe ()
  {
    return standortListe;
  }
  
  
  /**
   * Gibt eine Liste mit den temporaeren Standorten zurueck.
   * @return ArrayListe mit allen temporaeren Standorten.
   */
  public ArrayList<Standort> gibStandortListeTemp ()
  {
    return temp;
  }
  
  
  /**
   * Speichert den Zustand der Listen.
   */
  public void zustandSpeichern () 
  {
    try 
    { 
      ea = new EA ("medienverwaltung.standort"); 
      ea.speichernXML (standortListe); 
      ea = new EA ("medienverwaltung.zuordnungIS"); 
      ea.speichernXML (zuordnungIS); 
    } 
    catch (IOException e) 
    { 
      e.printStackTrace (); 
    }
  }
  
  
  /**
   * Gibt eine Liste mit der Zuordung ID zu Standort zurueck.
   * @return HashMap mit Standort ID und Standort.
   */
  public HashMap<Integer, Standort> gibZuordnungIS ()
  {
    return zuordnungIS;
  }

  
  /**
   * Gibt die Standort ID des letzten hinzugefugen Standortes zurueck.
   * @return Standort ID des letzten Standortes.
   */
  public int gibStandortId ()
  {
   return  standortListe.get (standortListe.size()-1).gibStandortId ();
  }
  
  
  /**
   * Gibt die Standort ID des letzten in der temporaerenLIste  
   * hinzugefugen Standortes in zurueck.
   * @return Standort ID des letzten Standortes der temporaeren Liste.
   */
  public int gibStandortIdTemp ()
  {
    return  temp.get (temp.size()-1).gibStandortId ();
  }
  
  
  /**
   *  Test Augabe. 
   */
  public void ausgabeStandort ()
  {
    ArrayList<Standort> sl = gibStandortListe ();
    for (Standort s : sl)
    {
      System.out.println ("StandortId: " + s.gibStandortId ());
      System.out.println ("StandortAdresse: "+ " Ort: " +  s.
	  gibAdresse ().gibOrt () + " PLZ: " + s.gibAdresse ().gibPLZ ()
	  + " Strasse: " + s.gibAdresse ().gibStrasse () 
	  + " Hausnummer: " + s.gibAdresse ().gibGesamteHausnummer ());
      System.out.println ("Standortname: " + s.gibName ());
      ArrayList<Regal> rl = s.gibRegalListe ();
      for (Regal r : rl)
      {
        System.out.println ("RegalId: " + r.gibRegalId ());
        System.out.println ("AnzahlEtagen: " + r.gibAnzahlEtagen ());
        System.out.println ("Kuerzel: " + r.gibKuerzel ());
      }
    }
  }
    
  /**
   * Test Ausgabe.
   */
  public void ausgabeStandortTemp ()
  {
    ArrayList<Standort> sl = gibStandortListeTemp ();
    for (Standort s : sl)
    {
      System.out.println ("StandortId: " + s.gibStandortId ());
      System.out.println ("StandortAdresse: " + " Ort: "
          + s.gibAdresse ().gibOrt () + " PLZ: "
          + s.gibAdresse ().gibPLZ () + " Strasse: "
          + s.gibAdresse ().gibStrasse () + " Hausnummer: "
          + s.gibAdresse ().gibGesamteHausnummer ());
      System.out.println ("Standortname: " + s.gibName ());
      ArrayList<Regal> rl = s.gibRegalListe ();
      
      for (Regal r : rl)
      {
        System.out.println ("RegalId: " + r.gibRegalId ());
        System.out.println ("AnzahlEtagen: " + r.gibAnzahlEtagen ());
        System.out.println ("Kuerzel: " + r.gibKuerzel ());
        System.out.println ("Abschnitte: " + r.gibAbschnitte ());
        System.out.println ("Laenge: "
            + r.gibAbmessungEtage ().gibLaenge ());
        System.out.println ("Breite: "
            + r.gibAbmessungEtage ().gibBreite ());
        System.out.println ("Hoehe (Etage): "
            + r.gibAbmessungEtage ().gibHoehe ());
      }
    }
  }

  
  /**
   * Hier werden die Standorte der temporaeren Liste in die normale
   * Standort Liste hinzugefuegt. Die temporaere Liste wird am Ende 
   * geleert.
   */
  public void speichern ()
  {
    for (int i = 0; i < temp.size (); i++)
    {
      standortListe.add (temp.get (i));
    }
    temp.clear ();   
    zustandSpeichern ();
  }
  
  
  /**
   * Loescht den Inhalt der temporaeren Liste.
   */
  public void tempLoeschen ()
  {
    temp.clear ();
 }

}
